import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import type { UserInfo } from '@/types/user'
import { login, getUserInfo, type LoginParams } from '@/api/auth'

export const useUserStore = defineStore('user', () => {
  const token = ref<string>(localStorage.getItem('portal-admin-token') || '')
  const userInfo = ref<UserInfo | null>(null)
  
  // 用于全局管理 getUserInfo 请求，避免重复请求
  let getUserInfoPromise: Promise<any> | null = null

  const isLoggedIn = computed(() => !!token.value)

  // 登录（保留此方法以保持兼容性，但建议直接使用 login API）
  const loginAction = async (params: LoginParams) => {
    try {
      const res = await login(params)
      token.value = res.data.token
      localStorage.setItem('portal-admin-token', res.data.token)
      // 登录后清除缓存的请求，强制重新获取
      getUserInfoPromise = null
      await getUserInfoAction()
      return res
    } catch (error) {
      throw error
    }
  }

  // 获取用户信息 - 全局单例，确保同时只有一个请求
  const getUserInfoAction = async () => {
    // 如果已经有用户信息，直接返回（格式与 API 响应一致）
    if (userInfo.value) {
      return { 
        code: 200,
        message: 'success',
        data: userInfo.value 
      }
    }
    
    // 如果正在请求中，等待现有请求完成
    if (getUserInfoPromise) {
      return getUserInfoPromise
    }
    
    // 创建新的请求
    getUserInfoPromise = (async () => {
      try {
        const res = await getUserInfo()
        userInfo.value = res.data
        getUserInfoPromise = null // 请求完成后清除
        return res
      } catch (error) {
        getUserInfoPromise = null // 请求失败后清除，允许重试
        throw error
      }
    })()
    
    return getUserInfoPromise
  }

  // 退出登录
  const logout = () => {
    token.value = ''
    userInfo.value = null
    getUserInfoPromise = null // 清除请求缓存
    localStorage.removeItem('portal-admin-token')
  }

  return {
    token,
    userInfo,
    isLoggedIn,
    loginAction,
    getUserInfoAction,
    logout
  }
})

